package com.zdp.domain;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonIgnore;
import lombok.*;
import org.springframework.security.core.userdetails.UserDetails;

import java.io.Serializable;
import java.util.Set;

@AllArgsConstructor
@NoArgsConstructor
@Builder
@With
@TableName("t_user")
@Data
public class User implements UserDetails, Serializable {

    @TableId(value = "id", type = IdType.AUTO)
    private Long id;
    private String username;
    @JsonIgnore
    @TableField(value = "password_hash")
    private String password;
    private String name;
    private String mobile;
    private String email;
    // 这里用字段代替数据库查询操作，这里一定要Boolean要小写不然会报错
    private boolean enabled;
    private boolean accountNonExpired;
    private boolean accountNonLocked;
    private boolean credentialsNonExpired;
    // 权限集合 注意SET里面的泛型类必须继承至GrantedAuthority接口
    @TableField(exist = false)
    private Set<Role> authorities;
    // 是否启用两步认证
    @Builder.Default
    @TableField(value = "using_mfa")
    private boolean usingMfa = false;
    /**
     * 两步认证的key
     */
    @JsonIgnore
    @TableField(value = "mfa_key")
    private String mfaKey;




    // 权限集合字段
//    @Override
//    public Collection<? extends GrantedAuthority> getAuthorities() {
//        return null;
//    }

    // 账户过期 直接返回true表示不通过数据库了，我们自己就指定了，不过实际还是要通过数据库得出结果
//    @Override
//    public boolean isAccountNonExpired() {
//        return true;
//    }

    // 账户锁定
//    @Override
//    public boolean isAccountNonLocked() {
//        return true;
//    }

    // 密码是否过期
//    @Override
//    public boolean isCredentialsNonExpired() {
//        return true;
//    }

//    @Override
//    public boolean isEnabled() {
//        return false;
//    }
}
